package logic.util;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;

import org.apache.http.util.EncodingUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;


/**
 * @Title: FileUtil.java
 * @Package logic.util
 * @Description: TODO(添加描述)
 * @author 刘章
 * @date 2014年2月12日 下午1:53:25
 */
public class FileUtil
{
	/**
	 * 书籍详情
	 */
	public static final String BooK_INFO      = "info";
	
	/**
	 * 目录
	 */
	public static final String Book_CATALOGUE = "toc.ncx";
	
	/**
	 * @Title: FileExist
	 * @Description: 判断文件是否存在
	 * @param @param contentId
	 * @param @param fileName
	 * @param @return 设定文件
	 * @return boolean 返回类型
	 * @throws
	 * @date 2014年2月12日 下午2:51:18
	 */
	public static boolean FileExist(String contentId, String fileName) {
		return new File(OnlinePath(contentId) + fileName).exists();
	}
	
	/**
	 * @Title: OnlinePath
	 * @Description: 设置在线书的主目录
	 * @param @param contentId
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 * @date 2014年2月12日 下午2:51:38
	 */
	public static String OnlinePath(String contentId) {
		return SDcardUtil.isSDCARDMounted() ? SDcardUtil.mkDir(SDcardUtil.getOnlinePath().getPath() + File.separator + contentId).getPath() + File.separator : null;
	}
	
	/**
	 * @Title: OnlinePath
	 * @Description: 设置离线书籍的主目录
	 * @param @param contentId
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 * @date 2014年2月12日 下午2:51:38
	 */
	public static String DownloadPath() {
		return SDcardUtil.isSDCARDMounted() ? SDcardUtil.mkDir(SDcardUtil.getDownloadPath().getPath() + File.separator + SDcardUtil.books_dir).getPath() + File.separator : null;
	}
	
	/**
	 * @Title: ImageSavePath
	 * @Description: 社区图片保存路径
	 * @param @param contentId
	 * @param @return 设定文件
	 * @return String 返回类型
	 */
	public static String ImageSavePath() {
		return SDcardUtil.isSDCARDMounted() ? SDcardUtil.mkDir(SDcardUtil.getDownloadPath().getPath() + File.separator + SDcardUtil.image_dir).getPath() : null;
	}
	
	/**
	 * @Title: writeOnlineXML
	 * @Description: 写在线书文件
	 * @param @param contentId
	 * @param @param fileName
	 * @param @param xml
	 * @param @return 设定文件
	 * @return boolean 返回类型
	 * @throws
	 * @date 2014年2月12日 下午2:52:14
	 */
	public static boolean writeOnlineXML(String contentId, String fileName, String xml) {
		return FileUtil.writeSDFileByString(OnlinePath(contentId) + fileName, xml);
	}
	
	/**
	 * @Title: readOnlineXML
	 * @Description: 读在线书文件
	 * @param @param contentId
	 * @param @param fileName
	 * @param @return 设定文件
	 * @return String 返回类型
	 * @throws
	 * @date 2014年2月12日 下午2:52:31
	 */
	public static String readOnlineXML(String contentId, String fileName) {
		return readSDFileToString(OnlinePath(contentId) + fileName);
	}
	
	/**
	 * @Title: getFileForByte
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param @param file
	 * @param @return 设定文件
	 * @return byte[] 返回类型
	 * @throws
	 * @date 2012-11-23 下午3:20:55
	 */
	public static byte[] getFileForByte(File file) {
		byte[] data = null;
		try
		{
			FileInputStream fis = new FileInputStream(file);
			if (fis != null)
			{
				int len = fis.available();
				data = new byte[len];
				fis.read(data);
				fis.close();
				fis = null;
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return data;
	}
	
	//读文件  
	public static String readSDFileToString(String path) {
		byte[] bytes = readSDFile(path);
		return bytes == null ? null : EncodingUtils.getString(bytes, "UTF-8");
	}
	
	//读文件  
	public static byte[] readSDFile(String path) {
		try
		{
			File file = new File(path);
			FileInputStream fis = new FileInputStream(file);
			int length = fis.available();
			byte[] buffer = new byte[length];
			fis.read(buffer);
			fis.close();
			return buffer;
		}
		catch (Exception e)
		{
			return null;
		}
	}
	
	//写文件  
	public static boolean writeSDFileByString(String path, String write_str) {
		return writeSDFile(path, write_str.getBytes());
	}
	
	//写文件  
	public static boolean writeSDFile(String path, byte[] bytes) {
		try
		{
			File file = new File(path);
			if (file.exists())
			{
				file.delete();
			}
			FileOutputStream fos = new FileOutputStream(file);
			fos.write(bytes);
			fos.close();
			return true;
		}
		catch (Exception e)
		{
			return false;
		}
	}
	
	//删除文件
	public static boolean delFile(String path) {
		File file = new File(path);
		if (file.exists()) { return file.delete(); }
		return true;
	}
	
	/**
	 * @Title: getBitmap
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param @param pathName
	 * @param @return 设定文件
	 * @return Bitmap 返回类型
	 * @throws
	 * @date 2014年2月20日 下午8:45:18
	 */
	public static Bitmap getBitmap(String filepath) {
		File file = new File(filepath);
		if (!file.exists()) { return null; }
		Bitmap bitmap = BitmapFactory.decodeFile(filepath);
		return bitmap;
	}
	
	/**
	 * @Title: ByteToBitmap
	 * @Description: TODO(这里用一句话描述这个方法的作用)
	 * @param @param value
	 * @param @return 设定文件
	 * @return Bitmap 返回类型
	 * @throws
	 * @date 2014年2月20日 下午8:50:11
	 */
	public static Bitmap ByteToBitmap(byte[] value) {
		return BitmapFactory.decodeByteArray(value, 0, value.length);
	}
	
	public static boolean exists(String file) {
		return new File(file).exists();
	}
	
	public static Drawable getImageDrawable(String file) {
		if (!exists(file)) return null;
		try
		{
			InputStream inp = new FileInputStream(new File(file));
			return BitmapDrawable.createFromStream(inp, "img");
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 创建文件目录
	 * 
	 * @param dir
	 *            如：/sdcard/log
	 * @return
	 */
	public static File mkDir(String dir) {
		if (SDcardUtil.isSDCARDMounted())
		{
			File file = null;
			try
			{
				file = new File(dir);
				if (!file.exists())
				{
					file.mkdirs();
				}
				return file;
			}
			catch (Exception e)
			{
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
		}
		return null;
	}
	
	/**
	 * 获取文件夹大小
	 * 
	 * @param file
	 *            File实例
	 * @return long 单位为M
	 * @throws Exception
	 */
	public static long getFolderSize(java.io.File file) throws Exception {
		System.out.println("获取文件大小 - path:" + file.getPath());
		long size = 0;
		java.io.File[] fileList = file.listFiles();
		for (int i = 0; i < fileList.length; i++)
		{
			if (fileList[i].isDirectory())
			{
				size = size + getFolderSize(fileList[i]);
			}
			else
			{
				size = size + fileList[i].length();
			}
		}
		System.out.println("获取文件大小 - size:" + size);
		return size;
	}
	
	/**
	 * 删除指定目录下文件及目录
	 * 
	 * @param filePath
	 *            文件路径
	 * @param isDeleteFolder
	 *            是否删除目录
	 * @throws IOException
	 */
	public static void deleteFolderFile(String filePath, boolean isDeleteFolder) throws IOException {
		if (!TextUtils.isEmpty(filePath))
		{
			File file = new File(filePath);
			if (!file.exists()) { return; }
			if (file.isDirectory())
			{// 处理目录
				File files[] = file.listFiles();
				for (int i = 0; i < files.length; i++)
				{
					deleteFolderFile(files[i].getAbsolutePath(), isDeleteFolder);
				}
				if (isDeleteFolder && file.listFiles().length == 0)
				{// 目录下没有文件或者目录，删除
					file.delete();
				}
			}
			else
			{
				file.delete();
			}
		}
	}
	
	/**
	 * 格式化文件大小，以B、K、M、G的格式显示
	 * 
	 * @param fileS
	 * @return
	 */
	public static String FormetFileSize(long size) {// 转换文件大小
		System.out.println("格式化文件大小前 - size:" + size);
		DecimalFormat df = new DecimalFormat("#.00");
		String fileSizeString = "";
		if (size < 1)
		{
			fileSizeString = "";
		}
		else if (size < 1024)
		{
			fileSizeString = df.format((double) size) + "B";
		}
		else if (size < 1048576)
		{
			fileSizeString = df.format((double) size / 1024) + "K";
		}
		else if (size < 1073741824)
		{
			fileSizeString = df.format((double) size / 1048576) + "M";
		}
		else
		{
			fileSizeString = df.format((double) size / 1073741824) + "G";
		}
		System.out.println("格式化文件大小后 - size:" + fileSizeString);
		return fileSizeString;
	}
}
